#include <iostream>
#include <unistd.h>
#include <signal.h>

// 验证当投个信号的处理函数被调用时，内核自动将当前信号加入进程的信号屏蔽字，
// 当信号处理函数返回时自动恢复原来的信号屏蔽字

// 打印 pending表
void PrintPending(sigset_t &pending)
{
    std::cout << "我是一个进程，我的 pid：" << getpid() << std::endl;
    for (int signo = 31; signo > 0; signo--)
    {
        if (sigismember(&pending, signo))
        {
            std::cout << 1;
        }
        else std::cout << 0;
    }
    std::cout << "\n---------------------------------------\n" << std::endl;
}

void handler(int sig)
{
    std::cout << "hello signal: " << sig << std::endl;
    while (true)
    {
        // 不断获取 pending表
        sigset_t pending;
        int n = sigpending(&pending);
        (void)n;
        PrintPending(pending);
        sleep(1);
    }
    exit(0);
}

int main()
{
    struct sigaction act, oact;
    act.sa_handler = handler;
    sigemptyset(&act.sa_mask);
    sigaddset(&act.sa_mask, 3);
    sigaddset(&act.sa_mask, 4);
    sigaddset(&act.sa_mask, 5);
    act.sa_flags = 0;
    sigaction(SIGINT, &act, &oact);

    while (true)
    {
        std::cout << "hello world: " << getpid() << std::endl;
        sleep(1);
    }

    return 0;
}